package com.microservice.user.controller;

import com.microservice.api.auth.dto.LoginResponse;
import com.microservice.api.common.Result;
import com.microservice.api.user.dto.UserInfoDTO;
import com.microservice.api.user.dto.UserProfileUpdateDTO;
import com.microservice.api.user.dto.UserRegisterDTO;
import com.microservice.common.utils.AuthUtils;
import com.microservice.user.service.MenuService;
import com.microservice.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户控制器
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @Autowired
    private MenuService menuService;
    
    /**
     * 健康检查
     */
    @GetMapping("/health")
    public String health() {
        return "User Service is running";
    }
    
    /**
     * 用户注册
     */
    @PostMapping("/register")
    public Result<UserInfoDTO> register(@RequestBody UserRegisterDTO registerDTO) {
        log.info("用户注册请求: {}", registerDTO.getUsername());
        try {
            UserInfoDTO userInfo = userService.register(registerDTO);
            return Result.success("注册成功", userInfo);
        } catch (Exception e) {
            log.error("用户注册失败", e);
            return Result.error(e.getMessage());
        }
    }
    
    /**
     * 获取用户信息
     */
    @GetMapping("/{id}")
    public Result<UserInfoDTO> getUserById(@PathVariable Long id) {
        log.info("获取用户信息: {}", id);
        try {
            UserInfoDTO userInfo = userService.getUserInfo(id);
            return Result.success(userInfo);
        } catch (Exception e) {
            log.error("获取用户信息失败", e);
            return Result.error(e.getMessage());
        }
    }
    
    /**
     * 根据用户名获取用户信息（内部接口，供认证服务调用）
     */
    @GetMapping("/internal/username/{username}")
    public Result<UserInfoDTO> getUserByUsername(@PathVariable String username) {
        log.info("根据用户名获取用户信息: {}", username);
        try {
            var user = userService.getUserByUsername(username);
            if (user == null) {
                return Result.error("用户不存在");
            }
            UserInfoDTO userInfo = userService.getUserInfo(user.getId());
            return Result.success(userInfo);
        } catch (Exception e) {
            log.error("获取用户信息失败", e);
            return Result.error(e.getMessage());
        }
    }
    
    /**
     * 修改个人信息（普通用户）
     * 使用AuthUtils工具类简化代码，自动获取当前登录用户ID并验证权限
     */
    @PutMapping("/profile")
    public Result<UserInfoDTO> updateProfile(@RequestBody UserProfileUpdateDTO profileUpdateDTO) {
        try {
            // 使用工具类：自动获取当前用户ID，未登录会抛出异常
            Long currentUserId = AuthUtils.requireUserId();
            log.info("用户 {} (ID:{}) 修改个人信息", AuthUtils.getCurrentUsername(), currentUserId);
            
            // 使用当前登录用户的ID进行修改，确保用户只能修改自己的信息
            UserInfoDTO userInfo = userService.updateProfile(currentUserId, profileUpdateDTO);
            return Result.success("修改成功", userInfo);
        } catch (Exception e) {
            log.error("修改个人信息失败", e);
            return Result.error(e.getMessage());
        }
    }
    
    /**
     * 获取用户菜单树（内部接口，供Auth服务登录时调用）
     */
    @GetMapping("/internal/menus/{userId}")
    public Result<List<LoginResponse.MenuVO>> getUserMenus(@PathVariable Long userId) {
        try {
            List<LoginResponse.MenuVO> menus = menuService.getUserMenuTree(userId);
            log.info("获取用户 {} 的菜单，共 {} 个", userId, menus.size());
            return Result.success(menus);
        } catch (Exception e) {
            log.error("获取用户菜单失败，userId: {}", userId, e);
            return Result.error("获取菜单失败");
        }
    }
    
    /**
     * 获取用户角色列表（内部接口，供Auth服务登录时调用）
     */
    @GetMapping("/internal/roles/{userId}")
    public Result<java.util.Set<String>> getUserRoles(@PathVariable Long userId) {
        try {
            java.util.Set<String> roles = userService.getUserRoles(userId);
            log.info("获取用户 {} 的角色，共 {} 个", userId, roles.size());
            return Result.success(roles);
        } catch (Exception e) {
            log.error("获取用户角色失败，userId: {}", userId, e);
            return Result.error("获取角色失败");
        }
    }
    
    /**
     * 获取用户权限列表（内部接口，供Auth服务登录时调用）
     */
    @GetMapping("/internal/permissions/{userId}")
    public Result<java.util.Set<String>> getUserPermissions(@PathVariable Long userId) {
        try {
            java.util.Set<String> permissions = userService.getUserPermissions(userId);
            log.info("获取用户 {} 的权限，共 {} 个", userId, permissions.size());
            return Result.success(permissions);
        } catch (Exception e) {
            log.error("获取用户权限失败，userId: {}", userId, e);
            return Result.error("获取权限失败");
        }
    }
}
